进程与线程(一)

一、创建进程

在Linux系统中,只有fork()系统调用能够创建进程。调用fork()函数之后,父进程将寄存器和堆栈内的内容全部赋值给子进程的寄存器和堆栈。

</pre><pre name="code" class="cpp">/*
 *  fork_test.c
 *  version 1
 *  Created on: 2015-5-18
 *  Author: wangth
 */
#include <unistd.h>
#include <stdio.h> 
int main () 
{ 
	pid_t fpid; //fpid表示fork函数返回的值
	int count=0;
	fpid=fork(); 
	if (fpid < 0) 
		printf("error in fork!"); 
	else if (fpid == 0) {
		printf("i am the child process, my process id is %d/n",getpid()); 
		count++;
	}
	else {
		printf("i am the parent process, my process id is %d/n",getpid());
		count++;
	}
	printf("统计结果是: %d/n",count);
	return 0;
}
上述代码的结果为
i am the child process, my process id is
<pre name="code" class="cpp">统计结果是:1<span style="font-family: Arial, Helvetica, sans-serif;"> </span>

 
i am the parent process, my process id is 
<pre name="code" class="cpp">统计结果是: 1
 fork函数的返回值有3种情况 

(1) 在子进程内返回0

(2) 父进程内返回大于0

(3) 当创建进程出现错误时返回的值小于0

参考别人文章get的知识:

printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有/n 则会立即刷新stdout,因此就马上能够打印了。
二、进程切换

进程切换的概念首先要涉及的是硬件上下文,每个进程都有自己的内存空间,但是进程必须共享CPU的寄存器,而进程在恢复执行前必须装入寄存器的值就被称为硬件上下文。

当磁盘产生一个中断时,而进程正在执行,此时,中断硬件将程序计数器,程序状态字,硬件上下文压入到内核态的堆栈中,随即,计算机,跳转到中断向量所指示的地址,这些操作都是由硬件完成的。随后由中断服务例程接管一切剩余的工作。

三、线程

线程是mini版的进程,其存在理由有三:

(1)需要有一种并行实体共享同一个内存空间和所有可用数据

(2)线程相对比较轻量级,所以创建和切换线程时比较轻松

(3)多线程在多CPU系统中真正实现了并行

(4)线程允许计算和IO重叠运行,加快程序执行速度

web服务器中的例子中:

一个称为分派程序的线程从网络中读入工作请求。在检查请求之后,分派线程挑选一个空转的工作线程,提交该请求,将此空转线程从阻塞状态转为就绪状态。

工作线程在被唤醒之后检查所有线程都能够访问的web页面高速缓存,如果没有则调用读硬盘的系统调用read。在调用read时,阻塞这个线程直到该线程完成read操作。在阻塞该线程的同时,分配程序选择线程就绪队列中的另一个线程进行操作。

而此时如果是单线程,则在阻塞该进程之后,服务器空转,不执行后续到来的操作,可见多线程加速了程序的执行。

进程共享物理内存和磁盘,而线程共享同一个地址空间。


POSIX线程的一些函数

/*创建一个线程,成功返回0,失败返回error错误标志*/

[cpp]  view plain copy
  1. int pthread_create(pthread_t * thread,            //thread :线程id, unsigned long intxi型  
  2.                     const pthread_attr_t *attr,       //attr: 线程属性参数,创建时将根据这个参数进行线程初始化  
  3.                     void *(*start_routine)(void *), //start_routine:指向线程所调用的函数  
  4.                     void *arg);                                //arg :线程传递参数   

/* 终止线程,成功返回0,失败返回error错误 标志*/

[cpp]  view plain copy
  1. void pthread_exit(void *retval);      //retval:返回值指针  

  /*等待直到id为th线程运行结束(合并一个线程的意思)*/

[cpp]  view plain copy
  1. int pthread_join(pthread_t th, void**thread_return);  // th:线程id  
  2.                                         // thread_return :线程终止或取消时的返回值指针  

/*获取当前线程id*/

[cpp]  view plain copy
  1. pthread_t pthread_self(void);   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值