Process and thread: processes own resources, threads run code.
(Default) thread attributes
- PTHREAD_CREATE_JOINABLE: the thread is put into a zoombie state when it terminates, until you retrieve its exit status or detach it.
- inherit-scheduling attribute
- PTHREAD_INHERIT_SCHED: the thread inherits the scheduling policy of its parent thread.
- another value: PTHREAD_EXPLICIT_SCHED
- if we want to use different scheduling parameters for the new thread, this need to be changed to PTHREAD_EXPLICIT_SCHED.
- cancellation state
- PTHREAD_CANCEL_ENABLE: cancellation requests may be acted on accordingly to the cancelation type
- another state: PTHREAD_CANCEL_DISABLE
- cancellation type
- PTHREAD_CANCEL_DEFERRED: cancellation requests are held pending until a cancellation point.
- PTHREAD_CANCEL_A
- 4K stack
Thread scheduling
- Scheduling policy: inherited from the parent process (PTHREAD_INHERT_SCHED), by default. In all cases, a higher-priority thread can preempts all lower-priority threads one it gets READY.
- FIFO scheduling: apply only when two or more threads that share the same priority are READY.
- Round-robin scheduling: a thread stop executing when it consumes its timeslice.
- Sporadic scheduling
- Scheduling priority, independent of the scheduling policy. The scheduler selects the highest priority thread to run, from the READY threads.
- range 0 ~ 255
- 0 is for the special idle thread (in kernel), which is always ready to run.
- 1 ~ 63 for user threads. (the range can be changed by pronto -P option).
- 1 ~255 for root threads.
- range 0 ~ 255
Data structure
- pthread_attr_t: stack size, detachstate, schedparam, schedpolicy, etc
- struct sched_param: contains sched_priority, sched_curpriority
- int policy: FIFO(1), RR(2, default?), OTHER(3), SPORADIC(4)
APIs
- process level
- Get/set the priority of a process; if pid 0 used, it is for current process.
- sched_setparam(pid|0, &sched_param):
- sched_getparam(pid|0, &sched_param);
- get the priority range for the scheduling policy
- sched_get_priority_max(int policy);
- sched_get_priority_min(int policy);
- calculate the allowable priority for the policy
- allowable_priority = sched_get_priority_adjust(int priority, int policy, int adjust);
- priority = -1, priority of current thread.
- policy=SCHED_NOCHANGE, the policy of the called thread
- adjust=+20, we want a priority of “priority + 20”.
- allowable_priority = sched_get_priority_adjust(int priority, int policy, int adjust);
- Get/set the priority of a process; if pid 0 used, it is for current process.
- thread level (used after the thread is created)
- Set/get scheduling parameters
- pthread_getschedparam(tid, &policy, ¶m);
- pthread_setschedparam(tid, policy, ¶m)
- set the priority
- pthread_setschedprio(tid, prio);
- Note: the priority get should be achieved using pthread_getschedparam().
- set cancellation state/type
- pthread_setcancelstate(int newstate, &oldstate)
- pthread_setcanceltype(int newtype, &oldtype);
- not _get functions.
- can only be set after thread creation.
- Set/get scheduling parameters
- attribute level (only take effect before the thread is created)
- initialize/destroy attr object
- pthread_attr_init(&attr)
- pthread_attr_destroy(&attr); // the memory is not freed. but after destroying, reinit the object using pthread_attr_init()
- set/get policy
- pthread_attr_setschedpolicy(&attr, int policy)
- pthread_attr_getschedpolicy(&attr, &policy)
- set/get scheduling parameters
- pthread_attr_setschedparam(&attr, ¶m);
- used only after pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
- pthread_attr_getschedparam(&attr, ¶m);
- pthread_attr_setschedparam(&attr, ¶m);
- set/get inherit-scheduling attributes
- pthread_attr_setinheritsched(&attr, interitsched);
- pthread_attr_getinheritsched(&attr, &interitsched);
- need to be set prior to the thread creation
- initialize/destroy attr object
Advertisements