请选择 进入手机版 | 继续访问电脑版
查看: 996|回复: 0

[技术交流] linux进程和线程

[复制链接]

8

主题

10

帖子

28

积分

助理工程师

Rank: 1

积分
28
发表于 2019-5-31 17:36:14 | 显示全部楼层 |阅读模式
一、进程和线程的区别
1)进程是程序的一次执行,且是拥有资源的最小单位和调度单位(在拥有线程的操作系统中,线程是最小调度单位);
2)单个简单来说,并发允许同一时刻同时发生两件事情,而并行只允许在同一时刻只能发生一件事情。比如你在吃法的时候,有电话过来,你边吃饭边接电话就是并行,你放下手中的饭,单独去接电话就是并发。时间片轮转调度算法用的就是并发的概念,在同一时间,只能有一个任务处于运行状态。进程中执行的每个任务就是一个线程。线程是进程执行运算的最小单位。
3)一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程在同一时刻执行多个任务(线程)。
4)线程是一种轻量级的进程,它的代价或开销比较小;
5)线程没有单独的地址空间,线程包含在进程的地址空间中。
二、并发和并行
三、freertos线程和linux线程的区别
四、单核cpu和多核cpu
五、四核多线程的含义  
六、孤儿进程、守护进程和僵尸进程
1)一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
2)一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。  
僵尸进程的危害:但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。 但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。
七、linux线程安全
假设我们有两个线程,两个线程中分别只执行while(1){s++}这段代码。按照正常的思路,当我们执行两个线程n次,则s的值应该为2*n。实际测试中会发现,当执行的次数较少时满足s=2*n,但是当执行的次数较大是会出现s<2*n的情况。
s++的执行大致分为3步:
1)cpu从内存中将s的值读取出来;
2)cpu将s的值加一;
3)cpu将计算的结果放入内存;
在两个任务进行调度的时候,假如线程一刚把s(假设内存中s的值为10)的值从内存中读取出来进行了加一,还没来得及将s的值回存到内存中。此时发生了线程调度,程序挂起线程1,执行线程2,此时线程二从内存中取出来的s的值依然是10,s++后存入内存的值为11。之后线程二挂起,线程1继续运行,此时线程1需要将s的值11写回内存,这时不管线程二之前对s的值进行过多少次的累加,s的值都会被线程1覆盖掉。
为了解决上述为题,linux提供了加锁和解锁机制。
二、三、四、五欢迎补充。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表