linux 进程杂谈

一, linux进程状态

 

               TASK_RUNNING  态 :  可运行态,具备运行的条件,处于运行调度对列,等待调度,运行队列和调度策略与内核调度器类型有关,O(1)调度器2.6.23版本之后出现及CFG调度器后续分析。

               TASK_INTERRUPTIBLE 态: 可中断的等待状态,进程正在等待某个事件或资源,处于wait_queue等待队列, 可以通过信号唤醒。

               TASK_UNINTERRUPTIBLE态: 不可中断的等待状态,进程正在等待某个事件或资源,处于wait_queue等待队列,强制唤醒。

 

                      TASK_INTERRUPTIBLE 态,TASK_UNINTERRUPTIBLE态相关API:

                      等待队列结构:

                      struct  __wait_queue_head {
                                wq_lock_t  lock;
                                struct  list_head  task_list;
                                };
                      typedef  struct __wait_queue_head  wait_queue_head_t;
                     初始化方法:
                     静态方法:
                     DECLARE_WAIT_QUEUE_HEAD(name)
                     动态方法:
                     wait_queue_head_t my_queue;
                      init_waitqueue_head(&my_queue);

                     init_waitqueue_entry(wait_queue_head_t *head, task_struct * p);

                     void add_wait_queue(wait_queue_head_t *head, wait_queue_t *wait);

                    

                                                

                    休眠方式:

                    wait_event(queue, condition)   /*进程将被置于非中断休眠 */
                     wait_event_interruptible(queue, condition)

                     /*进程可被信号中断休眠,返回非0值表示休眠被信号中断*/

                    wait_event_timeout(queue, condition,timeout) 

                    wait_event_interruptible_timeout(queue, condition, timeout)

                    呼醒方式:

                    void wake_up(wait_queue_head_t *queue);   

                     /* 呼醒queue队列等待的进程 */

                    void wake_up_interruptible(wait_queue_head_t *queue);

 

                    wait_event的实现:

                    #define wait_event(wq, condition)      \
                 do {         \
                     if (condition)        \
                            break;       \
                     __wait_event(wq, condition);     \
                     } while (0)

                   #define __wait_event(wq, condition)      \
                  do {         \
                       wait_queue_t __wait;      \
                         init_waitqueue_entry(&__wait, current);    \
                         add_wait_queue(&wq, &__wait);     \
                       for (;;) {       \
                           set_current_state(TASK_UNINTERRUPTIBLE);  \
                           if (condition)      \
                                  break;      \
                            schedule();      \
                            }        \
                           current->state = TASK_RUNNING;     \
                             remove_wait_queue(&wq, &__wait);    \
                          } while (0)

                   wake_up的实现:

                          __wake_up((x),

                                   TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1)

                         void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr)
                         {
                            if (q) {
                           unsigned long flags;
                           wq_read_lock_irqsave(&q->lock, flags);
                          __wake_up_common(q, mode, nr, 0);
                          wq_read_unlock_irqrestore(&q->lock, flags);
                                   }
                         }

                       

                      void __wake_up_common (wait_queue_head_t *q, unsigned int mode,
                                  int nr_exclusive, const int sync)
                         {
                          struct list_head *tmp;
                          struct task_struct *p;

                          CHECK_MAGIC_WQHEAD(q);
                         WQ_CHECK_LIST_HEAD(&q->task_list);
 
                          list_for_each(tmp,&q->task_list) {
                          unsigned int state;
                          wait_queue_t *curr = list_entry(tmp, wait_queue_t, task_list);

                         CHECK_MAGIC(curr->__magic);
                         p = curr->task;
                         state = p->state;
                         if (state & mode) {
                         WQ_NOTE_WAKER(curr);
                         if (try_to_wake_up(p, sync) &&

                         (curr->flags&WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)        

                                                            /*nr_exclusive == 1呼醒第一个等待进程*/ 

                                                           /*  nr_exclusive == 0呼醒所有等待进程*/       

                             break;
                       }
                   }
                  }

                 void  sleep_on(wait_queue_head_t *q)                                 

                 long  sleep_on_timeout(wait_queue_head_t *q, signed long timeout) 使得当前进程处于睡眠状态

                                                                                                 使其处于UNINTERRUPTIBLE状态

                                                                                                  由wake_up函数呼醒

                 void  interruptible_sleep_on(wait_queue_head_t *q)                                 

                 long  interruptible_sleep_on_timeout(wait_queue_head_t *q, signed long timeout) 

                                                                                               使得当前进程处于睡眠状态

                                                                                                 使其处于INTERRUPTIBLE状态

                                                                                                  由wake_up_interruptible函数呼醒

                 struct completion {
                                        unsigned int done;
                                        wait_queue_head_t wait;
                                       };   

                  void init_completion(struct completion *x)

                  void complete(struct completion *x)   

                             void wait_for_completion(struct completion *x)

                 这组函数也是封装了_wake_up_common及__add_wait_queue_tail实现

 

                 实现如下:    

               void complete(struct completion *x)
               {
                   unsigned long flags;

                  spin_lock_irqsave(&x->wait.lock, flags);
                  x->done++;
                  __wake_up_common(&x->wait, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, 0);
                  spin_unlock_irqrestore(&x->wait.lock, flags);
               }

               void wait_for_completion(struct completion *x)
               {
                spin_lock_irq(&x->wait.lock);
                if (!x->done) {
                 DECLARE_WAITQUEUE(wait, current);

                 wait.flags |= WQ_FLAG_EXCLUSIVE;
                 __add_wait_queue_tail(&x->wait, &wait);
              do {
                 __set_current_state(TASK_UNINTERRUPTIBLE);
                spin_unlock_irq(&x->wait.lock);
                 schedule();
                 spin_lock_irq(&x->wait.lock);
               } while (!x->done);
                __remove_wait_queue(&x->wait, &wait);
              }
           x->done--;
           spin_unlock_irq(&x->wait.lock);
            }

 

            TASK_ZOMBIE状态: 是指进程结束但是尚未消亡的一种状态,除进程控制块外进程的所有资源都已经释放

                                                  进程处于僵死状态,待wait4()释放资源

            TASK_STOP状态:      进程暂停态,通过其它进程的信号才能呼醒该进程

 


   

                               
                                                                                                                                  

                   

 

 

 

 

 

 

 

                   


 

 
1. 内容概要 本项目是一个支持科学函数的命令行计算器,兼容 C++98 标准。它实现了中缀表达式词法分析、后缀表达式转换与求值,支持常见数学运算(如幂、三角函数、对数等)与括号优先级解析。程序还提供了角度版三角函数、角度与弧度互转功能,并支持函数调试输出与函数演示模式。 2. 适用人群 * C++ 初中级学习者,特别是希望深入理解表达式求值机制者 * 需要一个可扩展的计算引擎的项目开发者 * 想通过项目实践词法分析、调度场算法、数学函数封装的开发者 * 高校学生课程设计、编译原理实践者 3. 使用场景及目标 * 实现中缀表达式的完整求解器,支持函数嵌套、优先级与结合性处理 * 提供角度与弧度版本的三角函数,以适应不同输入偏好 * 演示中缀转后缀过程,辅助编程教育与算法教学 * 提供科学函数辅助计算,如 `log`, `sqrt`, `abs`, `exp`, `ceil`, `floor` 等 4. 其他说明 * 支持函数:sin, cos, tan(弧度);sind, cosd, tand(角度) * 支持函数嵌套,如 `sin(deg2rad(30))` * 支持操作符:+, -, \*, /, ^, \*\*(幂运算)与括号优先级 * 所有函数均通过 map 注册,方便扩展与自定义 * 输入 `help` 查看支持函数,`demo` 观看转后缀过程,`quit` 退出程序 * 提示用户避免使用 `°` 符号,推荐使用角度函数代替 * 可通过 `g++ calculator.cpp -o calculator -lm` 编译(需链接数学库)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值