os基础--线程进程面试题01

本文详细介绍了Java中实现线程的两种方法:继承Thread类和实现Runnable接口,以及Java中同步方法与同步块的概念。同时,阐述了Linux下线程同步的三种常见方式:互斥锁、条件变量和信号量,包括它们的基本操作函数和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三题:多线程有几种实现方法,都是什么?

java中:

实现线程有两种 继承Thread类或者实现Runnable接口... 实现同步也有两种,一种是用同步方法,一种是用同步块..
 同步方法就是在方法返回类型后面加上synchronized, 比如:
public void synchronized add(){...}

linux中:
是互斥锁、条件变量和信号量。
1)互斥锁(mutex)

  通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。

  int pthread_mutex_init(pthread_mutex_t *mutex,constpthread_mutex_attr_t *mutexattr);

  int pthread_mutex_lock(pthread_mutex *mutex);

  int pthread_mutex_destroy(pthread_mutex *mutex);

  int pthread_mutex_unlock(pthread_mutex *

2)条件变量(cond)

  利用线程间共享的全局变量进行同步的一种机制。条件变量上的基本操作有:触发条件(当条件变为 true时);等待条件,挂起线程直到其他线程触发条件。

  int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t*cond_attr);

  int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t*mutex);

  int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex*mutex,const timespec *abstime);

  int pthread_cond_destroy(pthread_cond_t *cond);

  int pthread_cond_signal(pthread_cond_t *cond);

  int pthread_cond_broadcast(pthread_cond_t *cond);//解除所有线程的阻塞

3)信号量

  如同进程一样,线程也可以通过信号量来实现通信,虽然是轻量级的。

  信号量函数的名字都以"sem_"打头。线程使用的基本信号量函数有四个。

  #include <semaphore.h>

  int sem_init (sem_t *sem , int pshared, unsigned intvalue);

  这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。

  两个原子操作函数:

  int sem_wait(sem_t *sem);

  int sem_post(sem_t *sem);

  这两个函数都要用一个由sem_init调用初始化的信号量对象的指针做参数。

  sem_post:给信号量的值加1;

  sem_wait:给信号量减1;对一个值为0的信号量调用sem_wait,这个函数将会等待直到有其它线程使它不再是0为止。

  int sem_destroy(sem_t *sem);

  这个函数的作用是再我们用完信号量后都它进行清理。归还自己占有的一切资源。

### 线程进程的区别 线程进程是计算机科学中两个重要的概念,尤其是在多任务处理和并发编程领域。以下是它们的主要区别: #### 定义 - **进程**是指操作系统分配资源的基本单位,是一个程序的执行实例[^3]。 - **线程**是进程内部的一个执行单元,也是 CPU 调度的基本单位。 #### 资源占用 - 每个进程都有独立的内存空间(包括代码区、数据区、堆栈等),因此其资源开销较大。 - 线程共享所属进程的内存空间和其他资源,仅拥有自己独立的栈段,所以资源开销较小[^4]。 #### 独立性 - 进程之间相互独立,一个进程崩溃通常不会影响到其他进程- 线程共享同一个进程的资源,如果某个线程发生错误,则可能会导致整个进程崩溃[^3]。 #### 通信方式 - 进程间的通信较为复杂,常见的方法包括管道、消息队列、信号量以及共享内存等方式。 - 线程之间的通信相对简单,可以通过直接访问共享变量来实现交互[^3]。 #### 创建与切换成本 - 创建一个新的进程需要复制父进程的部分状态,并为其分配新的内存区域,这使得进程创建的成本较高;同样,在不同进程间进行上下文切换也需要更多的时间。 - 对于线程而言,由于它只维护少量的状态信息并且可以重用所在进程已存在的环境,因而无论是启动还是转换都更加高效。 #### 并发特性 - 多个不同的进程能够同时运行在各自的地址空间里完成各自的任务,适用于大规模分布式计算场景下的多任务协作模式[^3]。 - 单个进程中通过开启若干条路径即线程可让应用程序内部的不同部分并行工作起来,提高单一应用性能效率的同时保持较低管理代价。 ```python import os from multiprocessing import Process, current_process from threading import Thread, current_thread def process_task(): print(f'Process ID: {os.getpid()}') def thread_task(): print(f'Thread Name: {current_thread().name}') if __name__ == '__main__': processes = [] threads = [] for _ in range(2): p = Process(target=process_task) t = Thread(target=thread_task) processes.append(p) threads.append(t) for p in processes: p.start() for t in threads: t.start() for p in processes: p.join() for t in threads: t.join() ``` 以上代码展示了如何分别利用Python标准库中的`multiprocessing.Process`类创建子进程以及借助`threading.Thread`对象构建新线程来进行基本的操作演示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值