进程与线程基础知识

进程是资源(CPU、内存等)分配的基本单位,线程是CPU调度和分配的基本单位(程序执行的最小单位)。
线程是进程的一个执行流,进程其实是不能用来运行代码的,真正运行代码的是进程里的线程。

多进程更健壮,性能更好,但系统资源开销大,多进程通讯因为需要跨越进程边界,不适合大量数据的传送。多线程相反。

安全稳定选进程;快速频繁选线程;

进程间通讯:(1)管道/无名管道(2)信号(3)共享内存(4)消息队列(5)信号量(6)socket。
线程通讯:(1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁

进程的空间模型:

1)栈区:由编译器自动分配和释放,存放函数的参数值(形参)、局部变量(int a =1;还有指针变量)等,其操作方式类似于数据结构中的栈,先进后出。
2)堆区:一般由程序员分配和释放,若程序员不释放,可能会造成内存泄漏,程序结束的时候可能由操作系统回收,注意它与数据结构中的堆是两回事,分配方式类似于链表。
3)全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss),程序结束后系统释放。
4)文字常量区:常量字符串放在这里,程序结束后有系统释放。
5)程序代码区(.text):存放函数体的二进制代码。

子进程从父进程继承的主要有:用户号和用户组号堆栈共享内存;目录(当前目录、根目录);打开文件的描述符;但父进程和子进程拥有独立的地址空间和PID参数、不同的父进程号、自己的文件描述符。

并发,同步,异步,互斥,阻塞,非阻塞的概念

并发:在操作系统中,同个处理机上有多个程序同时运行即并发。并发可分为同步和互斥。
1)同步、互斥:
互斥:分布在不同进程之间的若干程序片断,规定当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如有同一个资源同一时间只有一个访问者可以进行访问,其他访问者需要等前一个访问者访问结束才可以开始访问该资源,但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:分布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。所以同步就是在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
总结:同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
2)同步、异步
同步:同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。
异步:异步和同步是相对的,异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。

注意:
(1)线程是实现异步的一个方式。可以在主线程创建一个新线程来做某件事,此时主线程不需等待子线程做完而是可以做其他事情。
(2)异步和多线程并不是一个同等关系。异步是最终目的,多线程只是我们实现异步的一种手段。
3)阻塞,非阻塞:
阻塞和非阻塞是当进程在访问数据时,根据IO操作的就绪状态不同而采取的不同处理方式,比如主程序调用一个函数要读取一个文件的内容,阻塞方式下主程序会等到函数读取完再继续往下执行,非阻塞方式下,读取函数会立刻返回一个状态值给主程序,主程序不等待文件读取完就继续往下执行。一般来说可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
4)同步阻塞,同步非阻塞,异步阻塞,异步非阻塞:
以发送方发出请求要接收方读取某文件内容为例。
同步阻塞:发送方发出请求后一直等待(同步),接收方开始读取文件,如果不能马上得到读取结果就一直等,直到获取读取结果再响应发送发,等待期间不可做其他操作(阻塞)。
同步非阻塞:发送方发出请求后一直等待(同步),接收方开始读取文件,如果不能马上的得到读取结果,就立即返回,接收方继续去做其他事情。此时并未响应发送发,发送方一直在等待。直到IO操作(这里是读取文件)完成后,接收方获得读取结果响应发送方,接收方才可以进入下一次请求过程。(实际不应用)
异步阻塞:发送方发出请求后,不等待响应,继续其他工作(异步),接收方读取文件如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作(阻塞)。(实际不应用)
异步非阻塞:发送方发出请求后,不等待响应,继续其他工作(异步),接收方读取文件如果不能马上得到结果,也不等待,而是马上返回取做其他事情。当IO操作(读取文件)完成以后,将完成状态和结果通知接收方,接收方在响应发送方。(效率最高)

总结:
1)同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
2)阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
3)阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。

线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?
同步是个过程,阻塞是线程的一种状态:当多个线程访问同一资源时,规定同一时间只有一个线程可以进行访问,所以后访问的线程将阻塞,等待前访问的线程访问完。
  注意:**线程同步不一定发生阻塞!**线程同步的时候,需要协调推进速度,只有当访问同一资源出现互相等待和互相唤醒会发生阻塞。

孤儿进程、僵尸进程、守护进程

没有父进程的进程就是孤儿进程,孤儿进程会被init领养,成为一个准守护进程。如果进程他爹活着,但是不给子进程收尸(wait、waitpid),子进程就会变成僵尸(zombie)。守护进程(Daemon)是在一类脱离终端在后台执行的程序, 不与任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,它们以root用户或者其他特殊用户(apache和postfix)运行,并能处理一些系统级的任务,通常以 d 结尾, 随系统启动, 其父进程 (ppid) 通常是 init 进程。

僵尸进程存在,浪费了进程Id,进程的id是一种有限资源,系统中的进程数量是有限的,虽然僵尸进程占用的资源和内存都比较少,但是它却占领着数字,可能会导致系统无法再创建新的进程,因此及时清除僵尸进程很重要!

(子进程exit();主动结束,但它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构,发送SIGCHLD信号17给父进程,父进程收到此信号后,signal(17,func);func()执行waitpid()函数或者wait()函数为子进程收尸。)

孤儿进程并不会有什么危害。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值