标签:编码 thread 存储器 多线程程序 isset 例程 共享资源 解锁 多个
1.并发:逻辑控制流在时间上重叠
2.并发程序:使用应用级并发的应用程序称为并发程序
3.三种基本的构造并发程序的方法:
(1)进程,用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。
(2)I/O多路复用,应用程序在一个进程的上下文中显式的调度控制流。逻辑流被模型化为状态机。
(3)线程,运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。
1.构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。
2.因为父子进程中的已连接描述符都指向同一个文件表表项,所以父进程关闭它的已连接描述符的拷贝是至关重要的,而且由此引起的存储器泄露将最终消耗尽可用的存储器,使系统崩溃。
(1)需要一个SIGCHLD处理程序,来回收僵死子进程的资源。
(2)父子进程必须关闭各自的connfd拷贝。对父进程尤为重要,以避免存储器泄露。
(3)套接字的文件表表项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。
(1)网络客户端发起连接请求
(2)用户在键盘上键入命令行。
(1)分配它们;
(2)将一个此种类型的变量赋值给另一个变量;
(3)用FDZERO、FDSET、FDCLR和FDISSET宏指令来修改和检查它们。
(1)比基于进程的设计给了程序员更多的对程序行为的控制
(2)运行在单一进程上下文中,因此,每个逻辑流都能访问该进程的全部地址空间,使得流之间共享数据变得很容易。
(3)不需要进程上下文切换来调度新的流。
(1)编码复杂
(2)不能充分利用多核处理器
(1)线程的上下文切换要比进程的上下文切换快得多;
(2)和一个进程相关的线程组成一个对等池,独立于其他线程创建的线程。
(3)主线程和其他线程的区别仅在于它总是进程中第一个运行的线程。
(1)一个线程可以杀死它的任何对等线程;
(2)等待它的任意对等线程终止;
(3)每个对等线程都能读写相同的共享资源。
(1)当顶层的线程例程返回时,线程会隐式的终止;
(2)通过调用pthread _exit函数,线程会显示地终止。如果主线程调用pthread _exit,它会等待所有其他对等线程终止,然后再终止主线程和整个进程。
1.全局变量:虚拟存储器的读/写区域只会包含每个全局变量的一个实例。
2.本地自动变量:定义在函数内部但没有static属性的变量。
3.本地静态变量:定义在函数内部并有static属性的变量。
Hi:在循环头部的指令块
Li:加载共享变量cnt到寄存器%eax的指令,%eax表示线程i中的寄存器%eax的值
Ui:更新(增加)%eax的指令
Si:将%eaxi的更新值存回到共享变量cnt的指令
Ti:循环尾部的指令块。
(1)读者优先,要求不让读者等待,除非已经把使用对象的权限赋予了一个写者。
(2)写者优先,要求一旦一个写者准备好可以写,它就会尽可能地完成它的写操作。
(3)饥饿就是一个线程无限期地阻塞,无法进展。
(1)不保护共享变量的函数
(2)保持跨越多个调用的状态的函数。
(3)返回指向静态变量的指针的函数。解决办法:重写函数和加锁拷贝。
(4)调用线程不安全函数的函数。
1.可重入函数:当它们被多个线程调用时,不会引用任何共享数据。可重入函数是线程安全函数的一个真子集 。
2.关键思想是我们用一个调用者传递进来的指针取代了静态的next变量。
3.显式可重入:没有指针,没有引用静态或全局变量
隐式可重入:允许它们传递指针
1.可重入性即使调用者也是被调用者的属性,并不只是被调用者单独的属性。
2019-2020-1 20175316 《信息安全系统设计基础》第8周学习总结
标签:编码 thread 存储器 多线程程序 isset 例程 共享资源 解锁 多个
原文地址:https://www.cnblogs.com/sms369/p/11879025.html